/**
 *
 * @param {*} type 对应view add modify
 * @param {*} initData 只有view 和modify 时需要初始化数据
 * @param {*} delComponnet 动态控制显隐的组件
 */
var UnitMemberObj = function (type, initData = {}, delComponnet = {}) { // 建造者模式组装对象：将有相似属性的对象作为组装对象的一个对象，提取相同属性， 复杂对象拆分, 通过传递参数返回 查看或者可编辑的组件
  // 以后增删表单项只需维护这个对象的属性即可
  // 通过字段就可以维护一些校验规则比如必填项
  // 表单项放在原型属性满足开闭原则
  // 注：返回的对象不一定可按构建顺序输出，但大部分情况下可以保证， 适用场景是管理类表单
  // 普通文本输入框
  var readonly = (type === 'view') // 只有查看时只读
  var Field = function () {}
  Field.prototype.addItem = function (order, key, label = '', maxLength = '100', required = true, value = '') {
    this[order] = {
      key, value: initData[key] || value, label, required: type !== 'view' && required, type: 'field', readonly, maxLength
    }
    return this
  }
  Field.prototype
    .addItem('1', 'name', '姓名')
  // 手机号输入框
  var FieldPhone = function (type) {}
  FieldPhone.prototype.addItem = function (order, key, label = '', maxLength = '11', required = true, value = '') {
    this[order] = {
      key, value: initData[key] || value, label, required: type !== 'view' && required, type: 'field_phone', readonly, maxLength
    }
    return this
  }
  FieldPhone.prototype
    .addItem('2', 'mobilePhone', '手机')
    .addItem('3', 'roleName', '功能权限')
    .addItem('4', 'dateAuthType', '数据权限')
  // 标题
  var Title = function () {}
  Title.prototype.addItem = function (order, key, label = '', value = '') {
    this[order] = {
      key, value, label, type: 'title'
    }
    return this
  }
  Title.prototype.addItem('0', 'info', '用户信息：', '')
  var ID = function () {
    if (initData.id) {
      this[7] = {key: 'id', value: initData.id}
    }
  }
  var unitMember = {} // 最终表单对象
  var Builder = function () { // 建造者
    var BuildOrderingUnit = function () {}
    BuildOrderingUnit.prototype.set = function (part) { // 组装器
      for (let key in part) {
        if (typeof (part[key]) === 'object' && !delComponnet[part[key].key]) {
          unitMember[key] = part[key]
        }
      }
    }
    for (var i = 0; i < arguments.length; i++) {
      if (typeof (arguments[i]) === 'object') {
        BuildOrderingUnit.prototype.set(arguments[i])
      }
    }
  }
  // 普通文本框部分
  let field = new Field()
  // 电话文本框部分
  let fieldPhone = new FieldPhone()
  // 标题
  let title = new Title()
  // ID
  let id = new ID()
  Builder(field, fieldPhone, title, id) // 组装完整对象
  // console.log(unitMember)
  unitMember.length = Object.keys(unitMember).length // 为了保证表单项目的输出顺序最后要把{}转为数组
  return unitMember
}
export default UnitMemberObj
